package cn.tedu.charging.device.service;

import cn.tedu.charging.common.pojo.po.ChargingGunInfoPO;
import cn.tedu.charging.common.pojo.po.ChargingStationPO;
import cn.tedu.charging.common.pojo.po.ChargingVehiclePO;
import cn.tedu.charging.common.pojo.vo.GunInfoVO;
import cn.tedu.charging.common.pojo.vo.StationDetailVO;
import cn.tedu.charging.common.pojo.vo.StationInfoVO;
import cn.tedu.charging.device.dao.repository.GunRepository;
import cn.tedu.charging.device.dao.repository.StationRepository;
import com.alibaba.nacos.common.utils.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.GeoResult;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.domain.geo.GeoLocation;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
public class StationService {
    @Autowired
    private StationRepository stationRepository;
    @Autowired
    private GunRepository gunRepository;
    //操作缓存 一种简单的用法 就是直接在业务层注入redisTemplate拿到想要的所有数据
    //但是中间加了一个仓储层 进行业务是实现的解耦  要求 所有数据读写处理 都经过仓储层完成
    public List<StationInfoVO> nearbyStations(Double longitude, Double latitude, Double radius) {
        //1.调用仓储层 查询缓存 命中的所有充电桩 geo数据 返回数据类型
        GeoResults<GeoLocation<Integer>> geoResults=stationRepository.nearbyStations(longitude,latitude,radius);
        //2.解析这个数据
        List<GeoResult<GeoLocation<Integer>>> contents = geoResults.getContent();
        //3.通过contents 命中的数据 一次封装返回值stationInfoVO数据 如果contents是非空才封装vo
        List<StationInfoVO> vos=null;
        if (CollectionUtils.isNotEmpty(contents)){
            log.debug("本次查询附近充电站,命中数据:{}个",contents.size());
            vos=new ArrayList<>();
            //方案一 转化contents stationInfoVOs 使用for循环
            for (GeoResult<GeoLocation<Integer>> content : contents) {
                StationInfoVO vo=new StationInfoVO();
                vo.setStationId(content.getContent().getName());
                //lng:x lat:y
                vo.setStationLng(new BigDecimal(content.getContent().getPoint().getX()));
                vo.setStationLat(new BigDecimal(content.getContent().getPoint().getY()));
                //distance 返回经度到达万分为 4个小数点,可以缩短到2位小数点
                vo.setDistance(content.getDistance().getValue());
                String stationName=stationRepository.getStationNameById(vo.getStationId());
                vo.setStationName(stationName);
                vos.add(vo);
            }
        }
        return vos;
    }

    public StationDetailVO detailStation(Integer stationId) {
        log.debug("即将查询充电站详情,stationId:{}",stationId);
         ChargingStationPO po=stationRepository.getStationById(stationId);
         if (po==null){
             throw new RuntimeException("查询充电站详情失败,stationId:"+stationId);
         }
         StationDetailVO vo=new StationDetailVO();
         vo.setStationName(po.getStationName());
         vo.setAddress(po.getAddress());
          List<ChargingGunInfoPO> gunPos=gunRepository.getGunsByStationId(stationId);
          List<GunInfoVO> gunInfoVOS=null;
          if (CollectionUtils.isNotEmpty(gunPos)){
              gunInfoVOS=gunPos.stream().map(pos->{
                GunInfoVO gunInfoVO=  new GunInfoVO();
                BeanUtils.copyProperties(pos,gunInfoVO);
                return gunInfoVO;
              }).collect(Collectors.toList());
          }
          vo.setGunInfoPOList(gunInfoVOS);
          return vo;
      }
}
